#include <iostream>
#include "CmdLineParser.h"
#include "FileAdmin.h"
#include "Lista.h"
#include "Archivo.h"
#include <fstream>
#include "BitHandlerOutput.h"
#include "LZP.h"

using namespace std;


int main(int argc,char**argv)
{

	CmdLineParser c;
	if(c.Parse(argc,argv)<0)
		cout<<"Error en los argumentos de entrada"<<endl;
	else
	{
		if(((string)argv[1])=="-l")
		{
		    FileAdmin fad;
		    Lista<Archivo*>*lista=fad.listar((string)argv[2]);
		    cout<<"Archivos contenidos en "<<argv[2]<<endl;
		    for(int x=0;x<lista->length();x++)
		    {
                cout<<lista->recuperar(x)->getNombre()<<endl;
                delete lista->recuperar(x);
		    }
		    delete lista;
		}
		else
		{
            if(((string)argv[1])=="-a")
            {
                Lista<Archivo*> archs;
                Lista<Archivo*> *creados=new Lista<Archivo*>();
                for(int x=2;x<argc-1;x++)
                {
                    Archivo *nuevo=new Archivo(argv[x],0,1);
                    archs.insertar(nuevo);
                    creados->insertar(nuevo);
                }
                FileAdmin fadm;
                int pos=4;
                Lista<Archivo*> *acomprimir=fadm.limpiarParaComprimir(&archs,argv[argc-1],&pos,creados);
                LZP lzp;
                BitHandlerOutput bho(argv[argc-1],ios::binary);

                for(int x=0;x<acomprimir->length();x++)
                {
                	if(acomprimir->recuperar(x)->getEstado()==1)
                	{
                		cout<<"comprimir "<<acomprimir->recuperar(x)->getNombre()<<endl;
                		acomprimir->recuperar(x)->setPosicion(pos);
                		pos=lzp.comprimir(acomprimir->recuperar(x)->getNombre(),bho,pos);
                	}

                }
                bho.cerrarArchivo();
                fadm.actualizarAreaAdministrativa(pos,acomprimir,argv[argc-1]);

                for(int x=0;x<creados->length();x++)
                	delete creados->recuperar(x);
                delete creados;
                delete acomprimir;
            }
            if(((string)argv[1])=="-x")
            {
                Lista<Archivo*> archs;
                Lista<Archivo*>*creados=new Lista<Archivo*>();
                for(int x=2;x<argc-1;x++)
                {
                    Archivo *nuevo=new Archivo(argv[x],0,0);
                    archs.insertar(nuevo);
                    creados->insertar(nuevo);
                }
                FileAdmin fadm;
                LZP lzp;
                Lista<Archivo*> *adescomprimir=fadm.limpiarParaDescomprimir(&archs,argv[argc-1],creados);
                BitHandlerInput bhi(argv[argc-1],ios::binary);
                for(int x=0;x<adescomprimir->length();x++)
                {
                    cout<<"descomprimir "<<adescomprimir->recuperar(x)->getNombre()<<endl;
                    lzp.descomprimir(adescomprimir->recuperar(x)->getNombre(),bhi,adescomprimir->recuperar(x)->getPosicion());
                }

                for(int x=0;x<creados->length();x++)
                	delete creados->recuperar(x);
                delete creados;
                delete adescomprimir;
            }
            if(((string)argv[1])=="-d")
            {
            	Lista<Archivo*> archs;
                for(int x=2;x<argc-1;x++)
                {
                	Archivo *nuevo=new Archivo(argv[x],0,3);
                    archs.insertar(nuevo);
                }
                FileAdmin fadm;
                fadm.eliminar(&archs,argv[argc-1]);
                for(int x=0;x<archs.length();x++)
                	delete archs.recuperar(x);
            }
		}
	}
	return 0;
}
